const express = require('express')
const cors = require('cors')
const bcrypt = require('bcryptjs')
const { body, validationResult } = require('express-validator')
const { generateToken, verifyToken } = require('./middleware/auth')
const config = require('./config')

const app = express()

// 内存存储（用于测试）
const users = []
let userIdCounter = 1

// 中间件
app.use(cors())
app.use(express.json())

// 响应格式化中间件
app.use((req, res, next) => {
  res.success = (data, message = '操作成功') => {
    res.json({
      success: true,
      message,
      data
    })
  }

  res.error = (message, code = 'ERROR', statusCode = 400) => {
    res.status(statusCode).json({
      success: false,
      message,
      code
    })
  }

  next()
})

// 健康检查
app.get('/health', (req, res) => {
  res.success(
    {
      status: 'ok',
      timestamp: new Date().toISOString(),
      database: 'memory'
    },
    '服务运行正常'
  )
})

// 用户注册
app.post(
  '/api/auth/register',
  [
    body('email')
      .isEmail()
      .normalizeEmail()
      .withMessage('请输入有效的邮箱地址'),
    body('username')
      .isLength({ min: 2, max: 20 })
      .withMessage('用户名长度为2-20个字符'),
    body('password').isLength({ min: 6 }).withMessage('密码长度至少6个字符')
  ],
  async (req, res) => {
    try {
      // 验证输入
      const errors = validationResult(req)
      if (!errors.isEmpty()) {
        return res.error(errors.array()[0].msg, 'VALIDATION_ERROR')
      }

      const { email, username, password } = req.body

      // 检查邮箱是否已存在
      const existingUser = users.find(u => u.email === email)
      if (existingUser) {
        return res.error('邮箱已被注册', 'EMAIL_EXISTS')
      }

      // 检查用户名是否已存在
      const existingUsername = users.find(u => u.username === username)
      if (existingUsername) {
        return res.error('用户名已被使用', 'USERNAME_EXISTS')
      }

      // 加密密码
      const hashedPassword = await bcrypt.hash(
        password,
        config.security.bcryptSaltRounds
      )

      // 创建用户
      const user = {
        id: userIdCounter++,
        email,
        username,
        password_hash: hashedPassword,
        nickname: username,
        avatar_url: null,
        role: 'user',
        is_vip: false,
        vip_expire_date: null,
        coin_balance: 100,
        created_at: new Date()
      }

      users.push(user)

      // 生成token
      const token = generateToken(user.id)

      // 移除密码字段
      const userResponse = { ...user }
      delete userResponse.password_hash

      res.success(
        {
          user: userResponse,
          token
        },
        '注册成功，欢迎加入橘子小说！'
      )
    } catch (error) {
      console.error('注册错误:', error)
      res.error('注册失败', 'REGISTRATION_ERROR', 500)
    }
  }
)

// 用户登录
app.post(
  '/api/auth/login',
  [
    body('email')
      .isEmail()
      .normalizeEmail()
      .withMessage('请输入有效的邮箱地址'),
    body('password').notEmpty().withMessage('请输入密码')
  ],
  async (req, res) => {
    try {
      // 验证输入
      const errors = validationResult(req)
      if (!errors.isEmpty()) {
        return res.error(errors.array()[0].msg, 'VALIDATION_ERROR')
      }

      const { email, password } = req.body

      // 查找用户
      const user = users.find(u => u.email === email)
      if (!user) {
        return res.error('邮箱或密码错误', 'INVALID_CREDENTIALS', 401)
      }

      // 验证密码
      const isValidPassword = await bcrypt.compare(password, user.password_hash)
      if (!isValidPassword) {
        return res.error('邮箱或密码错误', 'INVALID_CREDENTIALS', 401)
      }

      // 生成token
      const token = generateToken(user.id)

      // 移除密码字段
      const userResponse = { ...user }
      delete userResponse.password_hash

      res.success(
        {
          user: userResponse,
          token
        },
        '登录成功，欢迎回来！'
      )
    } catch (error) {
      console.error('登录错误:', error)
      res.error('登录失败', 'LOGIN_ERROR', 500)
    }
  }
)

// 获取用户信息
app.get('/api/auth/profile', async (req, res) => {
  try {
    const authHeader = req.headers['authorization']
    const token = authHeader && authHeader.split(' ')[1]

    if (!token) {
      return res.error('访问令牌不存在', 'MISSING_TOKEN', 401)
    }

    // 验证token
    const decoded = verifyToken(token)
    if (!decoded) {
      return res.error('无效的访问令牌', 'INVALID_TOKEN', 401)
    }

    // 查找用户
    const user = users.find(u => u.id === decoded.userId)
    if (!user) {
      return res.error('用户不存在', 'USER_NOT_FOUND', 401)
    }

    // 移除密码字段
    const userResponse = { ...user }
    delete userResponse.password_hash

    res.success(userResponse, '获取用户信息成功')
  } catch (error) {
    console.error('获取用户信息错误:', error)
    res.error('获取用户信息失败', 'PROFILE_ERROR', 500)
  }
})

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error('服务器错误:', err)
  res.error('服务器内部错误', 'INTERNAL_SERVER_ERROR', 500)
})

// 启动服务器
const PORT = process.env.TEST_PORT || 3001
app.listen(PORT, () => {
  console.log(`🚀 测试服务器启动成功！`)
  console.log(`📍 服务地址: http://localhost:${PORT}`)
  console.log(`💾 使用内存存储（测试模式）`)
})

module.exports = app
